#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>

/* Jmeno programu. */
const char *program_name;

/* Tato funkce vypise napovedu do vystupniho
 * proudu STREAM(stderr, stdout) a ukonci se
 * s kodem EXIT_CODE.
 */
void print_help(FILE *stream, int exit_code)
{
  fprintf(stream, "Usage: %s options\n", program_name);
  fprintf(stream, "  -h  --help         Display this help screen.\n"
                  "  -o  --output file  Write output to file.\n"
                  "  -i  --input file   Read input from file.\n");
  exit(exit_code);
}

/* Funkci main zacina program. */
int main(int argc, char *argv[])
{
  int next_option;

  /* Retezec obsahujici kratke volby */
  const char *short_options = "ho:i:";

  /* Pole struktur s dlouhymi volbami */
  const struct option long_options[] = {
    { "help",    0, NULL, 'h' },
    { "output",  1, NULL, 'o' },
    { "input",   1, NULL, 'i' },
    { NULL,      0, NULL,  0  }
  };

  /* Jmeno souboru pro vystup nebo NULL pro stdout */
  const char *output_file = NULL;

  /* Jmeno souboru pro vstup nebo NULL pro stdin */
  const char *input_file = NULL;

  /* Jmeno programu je ulozeno v promene argv[0]. */
  program_name = argv[0];

  do {
    next_option = getopt_long(argc, argv, short_options, long_options, NULL);

    switch(next_option)
    {
      case 'h': /* -h nebo --help */
           print_help(stdout, 0);
      case 'o': /* -o nebo --output */
           output_file = optarg;
           break;
      case 'i': /* -i nebo --input */
           input_file = optarg;
           break;
      case '?': /* Uzivatel specifikoval neznamou volbu */
           print_help(stderr, 1);
      case -1 : /* Konec */
           break;
      default:
           abort();
    }
  } while(next_option != -1);

  /* Volby byly zpracovany. Promena OPTIND ukazuje
   * na prvni argument, ktery neni volbou.
   */

  return(0); /* Ukonceni programu s kodem 0 */
}
